[POWERPC][XEN] Inline clear_page() and use DCBZ to optimize
authorJimi Xenidis <jimix@watson.ibm.com>
Thu, 14 Sep 2006 05:36:39 +0000 (01:36 -0400)
committerJimi Xenidis <jimix@watson.ibm.com>
Thu, 14 Sep 2006 05:36:39 +0000 (01:36 -0400)
Signed-off-by: Jimi Xenidis <jimix@watson.ibm.com>
Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com>
xen/arch/powerpc/mm.c
xen/include/asm-powerpc/page.h

index 46d6db2236efb3300233bfb0ae659fb330450cbd..0172a6fb6f07ef4f2b5165690e4f1b6a6dc1e6f6 100644 (file)
@@ -209,16 +209,6 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
     return -ENOSYS;
 }
 
-void clear_page(void *page)
-{
-    if (on_mambo()) {
-        extern void *mambo_memset(void *,int ,__kernel_size_t);
-        mambo_memset(page, 0, PAGE_SIZE);
-    } else {
-        memset(page, 0, PAGE_SIZE);
-    }
-}
-
 extern void copy_page(void *dp, void *sp)
 {
     if (on_mambo()) {
index f7951d44d3b91e289da40f6abfed71878eaa2c69..f98d78d363c67fc6ad06738bdae0143be7b564e0 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <xen/config.h>
 #include <asm/misc.h>
+#include <asm/cache.h>
 
 #define PFN_DOWN(x)   ((x) >> PAGE_SHIFT)
 #define PFN_UP(x)     (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
@@ -70,7 +71,23 @@ typedef struct { unsigned long l1_lo; } l1_pgentry_t;
 #define pfn_to_paddr(pfn)   ((paddr_t)(pfn) << PAGE_SHIFT)
 #define paddr_to_pfn(pa)    ((unsigned long)((pa) >> PAGE_SHIFT))
 
-extern void clear_page(void *p);
+static __inline__ void clear_page(void *addr)
+{
+       unsigned long lines, line_size;
+
+       line_size = cpu_caches.dline_size;
+       lines = cpu_caches.dlines_per_page;
+
+       __asm__ __volatile__(
+       "mtctr  %1      # clear_page\n\
+1:      dcbz   0,%0\n\
+       add     %0,%0,%3\n\
+       bdnz+   1b"
+    : "=r" (addr)
+    : "r" (lines), "0" (addr), "r" (line_size)
+       : "ctr", "memory");
+}
+
 extern void copy_page(void *dp, void *sp);
 
 #define linear_pg_table linear_l1_table